iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
生成式 AI

打造自己的 AI 新聞小編:每天自動抓新聞、摘要、推送到 LINE!系列 第 21

【Day 20】你的 LINE Bot 已具備強大的「搜尋」能力!

  • 分享至 

  • xImage
  •  

今天我們只要再新增四個節點就能完成「關鍵字搜索」這個功能了,讓我們接著做下去吧~

篩選新聞

增加一個 Code(篩選新聞) 節點,並輸入以下程式碼:

const items = $input.all();
const keyword = items[0]?.json.keyword || null;
const results = [];

if (!keyword) {
  return [{ json: { keyword: "未設定關鍵字", results: [] } }];
}

for (const item of items) {
  const content = item.json.cleanedContent || "";
  if (content.toLowerCase().includes(keyword.toLowerCase())) {
    results.push(item.json);
  }
}

return [{ json: { keyword, results } }];

這段程式碼的重點是:

  1. 檢查 keyword 欄位是否存在,如果沒有設定關鍵字,程式會直接回傳一個包含「未設定關鍵字」訊息的結果。
  2. 將新聞內文和關鍵字都轉換成小寫,避免內文是「AI」但使用者輸入「ai」而找不到關鍵字的情況發生。

關於第一點我要再說明一下,你可能會想說:「前面明明有用一個 If 節點來判斷使用者輸入的內容是否有關鍵字了,為什麼這裡還要再打這行程式碼?」
(如果你忘了是哪個節點,偷偷提示一下圖片)
https://ithelp.ithome.com.tw/upload/images/20250923/20178067RpMdUZkjda.png

雖然我們在這個節點就已經有先判斷過使用者是否輸入正確格式,確認有關鍵字,但是有可能 keyword 這個欄位在傳遞結果途中的某處消失了,或是我們在更改前面的節點內容時沒注意到,導致 keyword 這個欄位根本沒產生,所以我們要加上一層保險,這樣執行工作流時能更清楚知道哪裡有什麼問題。

訊息格式化

在剛剛的 Code(篩選新聞) 節點後面連接一個 Code(搜索結果) 節點,輸入以下程式碼:

const { results: items, keyword } = $input.first().json;

let messages = [];

if (!items?.length) {
  messages.push({ type: "text", text: `❌ 沒有找到包含「${keyword}」的新聞喔~` });
} else {
  const combinedText = `以下是訂閱主題中包含「${keyword}」的新聞\n\n` +
    items.map(item => `📰 ${item.title}\n🔗 ${item.link}`).join('\n\n');

  messages.push({
    type: "text",
    text: combinedText.slice(0, 1000) // LINE 單則訊息最多 1000 字
  });
}

return [{ json: { replyToken: $input.first().json.replyToken, messages } }];

return [{
  json: {
    replyToken: $input.first().json.replyToken,
    messages: messages
  }
}];

這段程式碼的重點是:

  1. 判斷篩選過的新聞內文有沒有任何符合關鍵字的新聞,若沒有則回傳「❌ 沒有找到包含『${keyword}』的新聞喔~」這則訊息。
  2. 若有符合關鍵字的新聞內文,則開始格式化回傳訊息。
  3. LINE 單則文字訊息有 1000 字的限制,combinedText.slice(0, 1000) 確保訊息不會超過字數上限,如果超過字數上限,超過字數限制的訊息就會被自動截斷,接收者只能看到截斷後的部分,但通常關鍵字很少會 20 則新聞都符合吧!所以這點不太需要擔心。
  4. return Bot 實際回覆給使用者的訊息。

LINE 回覆訊息

Code(搜索結果) 節點 後面連接一個 HTTP Request 節點,這個節點想必你已經非常熟悉了,我就不多說明,設定都和之前功能相同為 LINE 回覆訊息的一樣。
https://ithelp.ithome.com.tw/upload/images/20250923/20178067Hxx8yz46Xw.png

剩下最後一個節點!我們要把兩天前建立的 Code(keyword) 節點和昨天新增的 Code(html) 節點 當成 Merge 節點的 Input,把 Code(keyword)Code(html) 節點的輸出結果都輸入進去並輸出給 Code(篩選新聞) 節點,這麼做的原因是:

RSS ReadHTTP Request 節點不會輸出 keyword 欄位,所以雖然我們在Code(keyword) 節點有輸出keyword 欄位,但執行到 RSS ReadHTTP Request 節點時它就會消失了。

因為如此,我們需要用一個 Merge 節點來把 Code(keyword) 節點輸出的 keyword 欄位留下來。

https://ithelp.ithome.com.tw/upload/images/20250923/20178067K2uHrlLc4e.png

完整的關鍵字搜索工作流如下圖所示:

https://ithelp.ithome.com.tw/upload/images/20250923/201780679putlLaLZc.png

成果展示

https://ithelp.ithome.com.tw/upload/images/20250923/20178067kyfp6389ga.png

https://ithelp.ithome.com.tw/upload/images/20250923/20178067gbGvfDbHqs.png

這樣就成功做完關鍵字搜索這個功能啦~恭喜你又完成了一項任務,辛苦了!

下篇預告

明天(Day 21)我們要開始做新功能,會先從 LINE 後台建立主題選單開始!


上一篇
【Day 19】新聞搜尋功能大躍進,逐漸完善的工作流
系列文
打造自己的 AI 新聞小編:每天自動抓新聞、摘要、推送到 LINE!21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言